// hdu3333
// 题意：给定n(<=30000)个数，一共有q(<=100000)个询问，每个询问要求输出
//       给定区间互异元素的和。
//
// 题解：good problem.
//       在线的方法很难想到，怎么想都想不到。所以可以考虑离线来做
//       （这题也没有修改操作）。
//       将每个询问区间按右端点从小到大排序。然后按照原数列顺序一个一个
//       将数插到数据结构中（bit就行），同时维护一个每个元素上次插入
//       位置的map，插入这个元素的同时将上次该元素位置置零。如果当前
//       插到的元素正好也是某一个询问区间的右端点，就计算这个询问。
//       比较巧妙。
//
// run: $exec < input
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>

struct query { int l, r, id; long long ans; };

bool operator<(query const & a, query const & b)
{
	return a.r < b.r;
}

int const maxn = 30007;
int const maxq = 100007;
query queries[maxq];
long long tree[maxn];
int a[maxn];
int n, q;

std::map<int, int> last_pos;

void init()
{
	last_pos.clear();
	std::memset(tree, 0, sizeof(tree));
}

int lowbit(int x) { return x & -x; }

void update(int x, long long d)
{
	for (; x <= n; x += lowbit(x)) tree[x] += d;
}

long long get_sum(int x)
{
	long long ret = 0;
	for (; x; x -= lowbit(x)) ret += tree[x];
	return ret;
}

int main()
{
	std::ios::sync_with_stdio(false);
	int T; std::cin >> T;
	while (T--) {
		std::cin >> n;
		init();
		for (int i = 1; i <= n; i++) std::cin >> a[i];
		std::cin >> q;
		for (int i = 0; i < q; i++) {
			std::cin >> queries[i].l >> queries[i].r;
			queries[i].id = i;
		}
		std::sort(queries, queries + q);
		for (int i = 1, j = 0; i <= n; i++) {
			update(i, a[i]);
			int t = last_pos[a[i]];
			if (t) update(t, -a[i]);
			last_pos[a[i]] = i;
			for (; queries[j].r == i; j++)
				queries[j].ans = get_sum(i) - get_sum(queries[j].l - 1);
		}
		std::sort(queries, queries + q, [](query const & a, query const & b){
					return a.id < b.id;
				});
		for (int i = 0; i < q; i++)
			std::cout << queries[i].ans << '\n';
	}
}

